package agentzia;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.Observable;
import java.util.Iterator;
import java.util.HashMap;
import java.util.Date;

/**
 * Bigarren mailako antolatzeko klasea
 */

class ErreserbaSistema extends Observable
{
    
    private Erreserba LoturaErreserba;
    private Turista LoturaTurista;
    
    public ErreserbaSistema()
    {
        


    }
    
    public void ezeztatu() {
        // Jakinarazi agenteari bertan behera utzi dugula erreserba
        try {
            Agentea agentea = AplikazioDatuBase.instance().getAgentea(LoturaErreserba.getAgentearenKodea());
            AgenteInterfazea agenteRMI = (AgenteInterfazea) Naming.lookup("rmi://" + agentea.getUrl() + "/agenteRmi");
            agenteRMI.libratuPlazak(LoturaErreserba.getIrteeraKod(), LoturaErreserba.getPertsonaKop());
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Erreserba lotura ezeztatu
        LoturaErreserba = null;
        
        // Bistak ohararazi
        setChanged();
        super.notifyObservers();
    }

    /**
     * Hemen metodoaren deskribapena sartu.
     * 
     * @param zerbitzuarenKodea
     *            java.lang.String
     * @param eskeinitakoData
     *            java.util.Date
     */
    public void sartuIrteera(int baieztapenZenbakia, int irteerarenKodea,
            Date eskeinitakoData) {
        // Berretsi erreserba agentearekin
        try {
            Agentea agentea = AplikazioDatuBase.instance().getAgentea(LoturaErreserba.getAgentearenKodea());
            AgenteInterfazea agenteRMI = (AgenteInterfazea) Naming.lookup("rmi://" + agentea.getUrl() + "/agenteRmi");
            agenteRMI.okupatuPlazak(irteerarenKodea, LoturaErreserba.getPertsonaKop());
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("Irteeraren kodea  " + irteerarenKodea + " data "
                + eskeinitakoData);
        // Bistak ohararazi
        setChanged();
        super.notifyObservers();
    }

    /**
     * Hemen metodoaren deskribapena sartu.
     * 
     * @param izena
     *            java.lang.String
     * @param helbidea
     *            java.lang.String
     * @param telefonoa
     *            java.lang.String
     */
    public void sartuTurista(String izena, String helbidea, String telefonoa) {
        // Turista sortu
        this.LoturaTurista = new Turista(izena, helbidea, telefonoa);

        System.out.println("Turistaren izena " + izena);
        // Bistak ohararazi
        setChanged();
        super.notifyObservers(new String("Turista: " + izena));
    }

    public Erreserba getLoturaErreserba()
    {
        return LoturaErreserba;
    }

    /**
    *
    * @return total double
    */
    public void erreserbaBerria(int pertsonaKopurua, String agentea, int irteeraKod, int baieztapenZenb, float prezioa)
    {
        // Erreserba sortu
        // TODO: irteeraKodea ere pasa eraikitzaileari!
        int erreserbaZenbakia = AplikazioDatuBase.instance().getAzkenErreserbarenZenbakia() + 1;
        this.LoturaErreserba = new Erreserba(erreserbaZenbakia, new java.util.Date(), agentea, pertsonaKopurua, irteeraKod, baieztapenZenb, prezioa);
        
        // Erreserba agentea bilatu eta erreserba  antolatzeko eskatu
        System.out.println(
            "Erreserba  " + pertsonaKopurua + " pertsonentzat  " + agentea +" agentearekin ");
        // Bistak ohararazi
        setChanged();
        super.notifyObservers("Baieztapen zenbakia: "+String.valueOf(baieztapenZenb));
    }


    public void setLoturaErreserba(Erreserba newLoturaErreserba)
    {
        LoturaErreserba = newLoturaErreserba;
    }


    /**
     * Erreserbaren datuak bilduta, datu-basean gorde
     */
    public void submit()
    {
        // Sartu turista datu-basean
        this.LoturaTurista.sartuTurista();
        // Gorde erreserba datu-basean
        this.LoturaErreserba.sartuErreserba(this.LoturaTurista.getIzena());


        System.out.println("Datubasera bidali da");
        LoturaErreserba = null;
        // Bistak ohararazi
        setChanged();
        super.notifyObservers();
    }
}
